package com.rabbitmq.exchange.direct;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.utils.RabbitMQUtils;
import com.sun.xml.internal.fastinfoset.util.ValueArray;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Send {
    public static void main(String[] args) {
        //创建工厂对象用于指定链接的信息
        //创建链接以及通道,并添加异常处理同时在try..catch执行完成后自动释放资源
        try(final Connection connection = RabbitMQUtils.getConnection();
            Channel channel=connection.createChannel()){
            /**
             * 声明一个队列
             *  参数 1 为队里名称 取值任意,如果这个名称已经存在则放弃创建,否则在MQ服务器中创建这个队列
             *  参数 2 为是否持久化的队列
             *  参数 3 为是否排外的队列true表示排外同时最多只允许有1个消费者监听这个队列
             *  参数 4 为是否自动删除 true为自动删除 当没有消费者监听这个队列时将自动删除队列以及消息
             *  参数 5 为队列的属性设置通常为null即可
             *  注意:
             *    这个行代码是可选代码,要在绑定交换机前确保存在
             */
            String queueName="directQueue";
            channel.queueDeclare(queueName,true,false,false,null);
            /**
             * 声明一个交换机
             * 参数 1 为交换机名称 取值任意,如果这个名称已经存在则放弃创建,否则在MQ服务器中创建这个交换机
             * 参数 2 交换机类型 取值为 direct fanout  topic  headers
             * 参数 3 为是否持久化的交换机
             * 注意:
             *    这个行代码是可选代码,但是要在发送和绑定队列前确保存在
             */
            String  exchangeName="directExchange";
            channel.exchangeDeclare(exchangeName,"direct",true);
            /**
             * 将队列和交换机进行绑定
             * 参数 1 为队列名称
             * 参数 2 为交换机名称
             * 参数 3 为路由表中的绑定键(BindingKey)
             * 注意:
             *    这个行代码是可选代码,但是要在发送消息前必须要确保队列和交换机成功绑定否则会丢失消息
             */
            channel.queueBind(queueName, exchangeName,"directKey");

            String message="Direct测试消息";
            /**
             * 发送消息到MQ
             * 参数 1 为交换机名称
             * 参数 2 为消息所携带的RoutingKey,由于没有使用交换机因此这个参数被识别成了队列名称
             * 参数 3 为消息的属性设置 通常为null即可
             * 参数 4 为具体消息数据取值为byte数组(建议String传递消息)
             * 注意:
             *   发送消息前需要确保队列已经存在否则会丢失消息
             */
            channel.basicPublish(exchangeName,"directKey",null,message.getBytes());
            System.out.println("消息发送成功");

        } catch (TimeoutException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
